package tt.Lematizador.GenerarIndice;

import java.io.FileNotFoundException;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import tt.Lematizador.Diccionario.Sinonimo;
import tt.Lematizador.Lexemas.Lexema;

public class GenerarIndice {
	public GenerarIndice(Sinonimo S){
		String palabraLeida=null;
		char letra='0';
		boolean nota=true;
		StringTokenizer token3;
		long indice=0;
		@SuppressWarnings("unused")
		int i=0;
		try{
			RandomAccessFile archSinonimos = new RandomAccessFile(S.getArchGenerar(), "r");
			archSinonimos.seek(0);
			RandomAccessFile archIndices = new RandomAccessFile(S.getArchIndice(),"rw");
			archIndices.seek(0);
			while (archSinonimos.getFilePointer() < archSinonimos.length()) {
				indice=archSinonimos.getFilePointer();
				palabraLeida= archSinonimos.readLine();      i++;
				palabraLeida= palabraLeida.trim();
				palabraLeida= palabraLeida.toLowerCase();
				Pattern p = Pattern.compile("^-|\\*");
		        Matcher m = p.matcher(palabraLeida);
		        if ( !m.find() && !palabraLeida.isEmpty()){
		            token3= new StringTokenizer(palabraLeida,"|");
		            palabraLeida=token3.nextToken();
		            //System.out.println(palabraLeida);
		            if(letra!=palabraLeida.charAt(0) && !palabraLeida.isEmpty()&& palabraLeida.charAt(0)!=' ' && !(palabraLeida.charAt(0)==225 || palabraLeida.charAt(0)==233 || palabraLeida.charAt(0)==237 || palabraLeida.charAt(0)==243 || palabraLeida.charAt(0)==250 )){
						letra=palabraLeida.charAt(0);
						nota=false;
					}
					if(palabraLeida.charAt(0)==letra && nota==false){
						archIndices.writeUTF(palabraLeida.charAt(0)+" "+indice);//Escribe archivo de indices para Lexemas
						nota=true;
//						System.out.println("|"+palabraLeida.charAt(0)+"| indice :"+indice+" |"+palabraLeida +"| linea :"+i+"\n");
//						System.out.println(palabraLeida.charAt(0)+" "+indice); //forma para ver el indice
					}
		        }
			}
		} catch (FileNotFoundException e) {
//			System.out.println("Error al leer el archivo, Arhivo "+ S.getArchGenerar()+" o " +S.getArchIndice() + " no encontrado");
			//e.printStackTrace();
		} catch (IOException e) {
//			System.out.println("EF");
		}
	}
	
	
	
	
	public GenerarIndice(Lexema X){
		String palabraLeida=null;
		String letras="";
		//String pal=null;
		boolean nota=true;
		long indice=0;
		
		try{
			RandomAccessFile lexemas = new RandomAccessFile(X.getArchGenerar(),"r");
			lexemas.seek(0);
			RandomAccessFile archIndices = new RandomAccessFile(X.getArchIndice(),"rw");
			archIndices.seek(0);
			while (lexemas.getFilePointer() < lexemas.length()) {
				
				indice=lexemas.getFilePointer();
				palabraLeida= lexemas.readLine();
				
				
				
				while(palabraLeida.isEmpty()){
					indice=lexemas.getFilePointer();
					palabraLeida= lexemas.readLine();
					
				}
				//pal=palabraLeida;
				
				StringTokenizer token2 = new StringTokenizer(palabraLeida," ");
				StringTokenizer token3 = new StringTokenizer(token2.nextToken(),"-");
				palabraLeida=token3.nextToken();
				
				while(token3.hasMoreTokens()){
					String a=token3.nextToken();
					if(!a.equals("@")) // se coloco como caso especial por que asi se encuentra la estructura del archivo, y es un caso que no interesa ***
						palabraLeida=palabraLeida+a;	
				}
				
				
				palabraLeida = Omitir(palabraLeida,"á","a");
				palabraLeida = Omitir(palabraLeida,"é","e");
				palabraLeida = Omitir(palabraLeida,"í","i");
				palabraLeida = Omitir(palabraLeida,"ó","o");
				palabraLeida = Omitir(palabraLeida,"ú","u");
				palabraLeida = Omitir(palabraLeida,"ü","u");

		        if(palabraLeida.length()>2 ){
		        	palabraLeida=palabraLeida.charAt(0)+""+palabraLeida.charAt(1)+""+palabraLeida.charAt(2);

		        }
		        //if(!(palabraLeida.charAt(0)=='a'||palabraLeida.charAt(0)=='b'||palabraLeida.charAt(0)=='c'||palabraLeida.charAt(0)=='d'||palabraLeida.charAt(0)=='e'||palabraLeida.charAt(0)=='i'||palabraLeida.charAt(0)=='p'||palabraLeida.charAt(0)=='r'||palabraLeida.charAt(0)=='s'/**/)){
		       	//palabraLeida=palabraLeida.charAt(0)+"";
		        //}
		        
		        if(!letras.equals(palabraLeida)){
		        	letras=palabraLeida;
		        	nota=false;
		        }
		        if(palabraLeida.equals(letras) && nota==false ){
		        	archIndices.writeUTF(palabraLeida+" "+indice);//TODO: Escribe archivo de indices para Lexemas
		        	nota=true;

//		        	System.out.println(palabraLeida+" "+indice ); //forma para ver el indice
		        }
		        	
			}
		} catch (FileNotFoundException e) {
//			System.out.println("Error al leer el archivo, Arhivo "+X.getArchGenerar()+" o " +X.getArchIndice() + " no encontrado");
			//e.printStackTrace();
		} catch (IOException e) {
//			System.out.println("EF");
		}
	}
	
	public String Omitir (String pal,String x,String y)
	{
		StringBuffer sb = new StringBuffer();
		Pattern p = Pattern.compile(x);
        Matcher m = p.matcher(pal);
        
        boolean resultado = m.find();
        while(resultado) {
            m.appendReplacement(sb, y);
            resultado=m.find();
        }
        m.appendTail(sb);
        return sb.toString();
	}
}
